package com.coder.rental.utils;

import cn.hutool.core.date.DateTime;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTPayload;
import cn.hutool.jwt.JWTUtil;

import java.util.Map;

/**
 * JWT工具类，用于创建和管理JWT令牌
 */
public class JwtUtils {
    /**
     * JWT签名密钥
     */
    public static final String SECRET_KEY = "zhangsan";

    /**
     * JWT过期时间，设置为100天（毫秒）
     */
    public static final long EXPIRE_TIME = 24*60*60* 1000L;

    /**
     * 创建JWT令牌
     *
     * @param payload 包含用户信息的载荷数据
     * @return 生成的JWT令牌字符串
     */
    public static String createToken(Map<String, Object> payload){
        // 设置JWT的时间相关参数
        DateTime now = DateTime.now();
        DateTime newTime=new DateTime(now.getTime()+EXPIRE_TIME);
        payload.put(JWTPayload.ISSUED_AT,now);
        payload.put(JWTPayload.EXPIRES_AT,newTime);
        payload.put(JWTPayload.NOT_BEFORE,now);

        // 使用指定密钥创建JWT令牌
        return JWTUtil.createToken(payload,SECRET_KEY.getBytes());
    }

    /*public static void main(String[] args) {
        Map<String, Object> payload = new HashMap<>() ;
        payload.put("username","admin");
        payload.put("id","123456");
        String token = createToken(payload);
        System.out.println(token);
    }*/
    /**
     * 解析并验证JWT token
     * @param token 待解析的token字符串
     * @return JWTPayload token的负载部分
     * @throws RuntimeException 当token异常或已过期时抛出异常
     */
    public static JWTPayload parseToken(String token){
        // 解析传入的token字符串
        JWT jwt = JWTUtil.parseToken(token);
        // 验证token的签名，确保token未被篡改
        if (!jwt.setKey(SECRET_KEY.getBytes()).verify()){
            throw new RuntimeException("token异常");
        }
        // 检查token是否过期
        if (!jwt.validate(0)){
            throw new RuntimeException("token已过期");
        }
        // 返回token的payload部分
        return jwt.getPayload();
    }
}
